﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace The_essence_of_the_operator
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //创建 爹妈实例 并起名
            Person person1 = new Person();
            Person person2 = new Person();
            person1.Name = "爹";
            person2.Name = "娘";

            /* 方法1
            *   创建泛型列表实例nation 并赋值为Person中的静态方法GetMarry的返回值
            *   List<Person> nation = Person.GetMarry(person1, person2); */

            //方法 2 ：使用 重载后的运算符   “+”
            List<Person> nation = person1 + person2;

            //由编译器自动推断出当前遍历元素的类型。
            //在每次循环中，当前遍历到的元素被赋值给变量 “p”，
            //然后可以在循环体内对 “p”操作（打印名字）
            foreach (var p in nation)
            {
               Console.WriteLine(p.Name);
            }
        }
    }
    class Person
    {
        public string Name;

        // “List<Person>” 表示一个泛型列表，用于存储Person类型的对象。

        /*  方法1
         *  public static List<Person> GetMarry(Person p1, Person p2) */

        //  方法 2 ：把方法名称替换为+ 只要它们的参数类型不同， 这个 + 替换就不会冲突
        public static List<Person> operator +(Person p1, Person p2)   
        {
            //创建 泛型列表实例
            List<Person> people = new List<Person>();

            //填充爹妈到列表
            people.Add(p1);
            people.Add(p2);
            
            int a = 0;

            //循环十一次
            for (int i = 0; i < 11; i++)
            {
                //创建孩子
                Person child = new Person();
                //给孩子起名
                child.Name = p1.Name + "&" + p2.Name + "孩子  " + a;
                //填充这个孩子到列表
                people.Add(child);

                a++;
            }

            //返回泛型列表实例
            return people;
        }
    }

}
